package com.kuang.service.impl;

import com.alibaba.fastjson.JSON;
import com.kuang.empty.vo.TenderingVO;
import com.kuang.mapper.TenderingMapper;
import com.kuang.service.api.ITenderingService;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.util.List;

/**
 * @项目名称：elastic-search
 * @包名：com.kuang.service.impl
 * @类名称：TenderingService
 * @类描述：
 * @创建人：liux @创建时间：2021年09月22日  14:34
 * @修改人：liux @修改时间：2021年09月22日  14:34
 * @修改备注
 * @版本信息：v1.0
 */
@Service
@Transactional
public class TenderingService implements ITenderingService {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
    @Autowired
    private TenderingMapper tenderingMapper;
    /**
     * @描述: 向ES中添加数据
     * @方法名: addData
     * @Param: []
     * @返回类型: void
     * @创建人: liux        @创建时间:2021年09月22 14:40
     * @修改人: liux        @修改时间:2021年09月22 14:40
     * @修改备注:
     * @Version: 1.0
     **/
    @Override
    public Boolean addData() {
        try {
            //判断索引是否存在
            GetIndexRequest getIndexRequest = new GetIndexRequest("tendering");
            boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
            if (!exists) {
                //创建索引
                CreateIndexRequest createIndexRequest = new CreateIndexRequest("tendering");
                CreateIndexResponse response = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
            }
            //查询要添加ES的数据
            List<TenderingVO> tenderingVOS = tenderingMapper.selectData(0,1000);
            if (tenderingVOS != null) {
                //批量添加
                BulkRequest bulkRequest = new BulkRequest();
                bulkRequest.timeout("60s");
                for (int i = 0; i < tenderingVOS.size(); i++) {
                    bulkRequest.add(new IndexRequest("tendering").id(""+tenderingVOS.get(i).getId()).source(JSON.toJSONString(tenderingVOS.get(i)), XContentType.JSON));
                }
                BulkResponse responses = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
                return responses.hasFailures();// 是否失败，如果false则表示全部成功
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * @param tenderingVO
     * @描述: 查询数据
     * @方法名: selectData
     * @Param: [tenderingVO]
     * @返回类型: java.util.List<com.kuang.empty.vo.TenderingVO>
     * @创建人: liux        @创建时间:2021年09月22 15:30
     * @修改人: liux        @修改时间:2021年09月22 15:30
     * @修改备注:
     * @Version: 1.0
     */
    @Override
    public List<TenderingVO> selectData(TenderingVO tenderingVO) {
        SearchRequest searchRequest = new SearchRequest("tendering");
        //构建搜索条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //条件判断，如果传入的属性为空的话则不执行该查询条件
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if(tenderingVO != null){
             if(tenderingVO.getNoticeName() != null){
                 boolQueryBuilder.should();
             }
        }
        return null;
    }
}
